
# -*- coding: utf-8 -*-

import os
import datetime
from reportlab.lib.units import inch
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import  ParagraphStyle as PS
from reportlab.platypus import SimpleDocTemplate, Paragraph
from reportlab.platypus import Table, TableStyle, Image
from reportlab.lib import colors
from reportlab.platypus import Spacer, PageBreak
from comunidadcyt.proyectos.models import Proyectos
from comunidadcyt.departamentos.views import obtenerDepto
from comunidadcyt.gruposDeInvestigacion.views import obtenerGrupoI
from comunidadcyt.lineasDeInvestigacion.views import obtenerLinea
from comunidadcyt.partners.views import obtenerPartner
from comunidadcyt.Publicaciones.models import Libros, Revistas, Conferencias, \
    Tesis,ReportesTecnicos,Papers
from django.contrib.auth.models import User
from comunidadcyt.proyectos.views import obtenerMiembros, obtenerDeptos
from django.http import HttpResponse
from django.shortcuts import render_to_response
from django.core.exceptions import ObjectDoesNotExist
from django.db.models import Q
from dateutil.relativedelta import relativedelta
from comunidadcyt.gruposDeInvestigacion.models import GruposDeInvestigacion
from comunidadcyt.Eventos.models import Eventos
from django.template.context import RequestContext


def index(request):
    c = {}
    
    today = datetime.date.today()

    a_month_late = today + relativedelta(months = -1)
    one_month_after = today + relativedelta(months = 1)
    #two_months_late = today + relativedelta(months = -2)
    #two_months_after = today + relativedelta(months = 2)

    #projects = Proyectos.objects.filter(Q(Fecha_inicio__gte = two_months_late),Q(Fecha_inicio__lte = two_months_after.isoformat()))
    #ending_projects = Proyectos.objects.filter(Q(Fecha_finalizacion__lte = today),Q(Fecha_finalizacion__gte = a_month_late.isoformat()))

    projects = Proyectos.objects.all().order_by('Fecha_inicio').reverse()[:2]
    groups = GruposDeInvestigacion.objects.all().order_by('Fecha_creacion').reverse()[:2]
    no_priv_events = Eventos.objects.filter(Q(fecha_inicio__lte = a_month_late) & Q(fecha_fin__lte = one_month_after)).filter(Q(privacidad = '') | Q(privacidad = 'Todo el mundo'))

    c.update({'user':request.user})
    c.update({'no_privacy_events':no_priv_events})
    c.update({'projects':projects})
    c.update({'groups':groups})
    #c.update({'ending_projects':ending_projects})

    return render_to_response('index.html',c,context_instance = RequestContext(request))


def informeProyectos(request, objectType, object_id):
    titulo = ''
    nombreObject = ''
    nombreArchivo = 'file'
    list_proyectos = []
    usuario = None
    userprofile = None

    if objectType == 'departamentos':
        list_proyectos = list(Proyectos.objects.filter(Departamentos=object_id))
        depto = obtenerDepto(request, object_id)
        nombreArchivo = "InformeProyectos_"+ depto.Nombre_departamento
        titulo = "Informe de Proyectos del Departamento" 
        nombreObject =  depto.Nombre_departamento
    elif objectType == 'grupos':
        list_proyectos = list(Proyectos.objects.filter(Grupos=object_id))
        grupoI = obtenerGrupoI(request, object_id)
        nombreArchivo = "InformeProyectos_"+ grupoI.Nombre_grupo
        titulo = "Informe de Proyectos del Grupo de Investigacion" 
        nombreObject =  grupoI.Nombre_grupo   
    elif objectType == 'lineas':
        list_proyectos = list(Proyectos.objects.filter(Lineas=object_id))
        linea = obtenerLinea(request, object_id)
        nombreArchivo = "InformeProyectos_"+ linea.Nombre_linea
        titulo = "Informe de Poryectos de la Linea" 
        nombreObject =  linea.Nombre_linea  
    elif objectType == 'partners':
        list_proyectos = list(Proyectos.objects.filter(Partners=object_id))
        partner = obtenerPartner(request, object_id)
        nombreArchivo = "InformeProyectos_"+ partner.Nombre_partner
        titulo = "Informe de Poryectos del Partner" 
        nombreObject =  partner.Nombre_partner
    elif objectType == 'usuarios':
        try:
            usuario = User.objects.get(id = object_id)
        except ObjectDoesNotExist:
            return render_to_response('error.html',{'errors':'No existe este usuario. El error es en la linea 48 de views.py del Proyecto.'})
        list_proyectos = []
        list_proyectos_full = list(Proyectos.objects.all())
        for proyecto in list_proyectos_full:
            list_miembros = list(obtenerMiembros(proyecto))
            if list_miembros.__contains__(usuario):
                list_proyectos += [proyecto]
        nombreArchivo = "InformeProyectos_"+ usuario.username
        titulo = "Informe de Proyectos de Usuario"
        userprofile = usuario.get_profile()
        usertitle = userprofile.titulo + " " if userprofile and userprofile.titulo != '---' else ""
        nombreObject =  usertitle + usuario.first_name + " " + usuario.last_name
    elif objectType == 'todos':
        list_proyectos = list(Proyectos.objects.all())
        nombreArchivo = "InformeProyectos"
        titulo = "Informe sobre todos los Proyectos"
        nombreObject =  "del Sistema" 
    
    response = HttpResponse(mimetype='application/pdf')
    response['Content-Disposition'] = 'inline; filename=%s' % nombreArchivo

    doc = SimpleDocTemplate (response, pagesize=A4, title=nombreArchivo, author="LED UCA")

    story = []
    
    h1 = PS (name = 'Heading 1', fontSize = 16, leading = 16, alignment = 1, textColor = colors.darkgreen)
    h2 = PS (name = 'Heading 2', fontSize = 12, leading = 14, alignment = 0, textColor = colors.blue)
    h2c = PS (name = 'Heading 2', fontSize = 12, leading = 14, alignment = 1, textColor = colors.blue)
    h3 = PS (name = 'Heading 3', fontSize = 12, leading = 14, alignment = 0)
    h3c = PS (name = 'Heading 3', fontSize = 12, leading = 14, alignment = 1)
    body_style = PS (name = 'Body', fontSize = 10, leading = 12)
    table_style = TableStyle ([ ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('BOX', (0,0), (-1,-1), 0.25, colors.white) ])

    P = Paragraph(titulo, h1)
    story.append(P)

    if not usuario:
        P = Paragraph(nombreObject, h1)
        story.append(P)
        story.append(Spacer(0,12))
        story.append(Spacer(0,12))
        story.append(Spacer(0,12))
    else:
        story.append(Spacer(0,12))
        story.append(Spacer(0,12))
        story.append(Spacer(0,12))
        path = os.path.dirname(os.path.abspath(__file__)) + usuario.get_profile().foto.url.replace('/',os.sep)
        img = Image(path, width=140, height=140)
        img.hAlign = 'CENTER'
        story.append(img)
        story.append(Spacer(0,12))
        story.append(Spacer(0,12))


        story.append(Paragraph("Miembro", h2c))
        story.append(Spacer(0,6))
        story.append(Paragraph(nombreObject, h3c))
        story.append(Spacer(0,12))
        story.append(Spacer(0,12))


        if usuario.email != "":
            story.append(Paragraph("e-Mail", h2c))
            story.append(Spacer(0,6))
            story.append(Paragraph(usuario.email, h3c))
            story.append(Spacer(0,12))
            story.append(Spacer(0,12))

        if userprofile:
            #if userprofile.fecha_nacimiento and userprofile.fecha_nacimiento != "":
            #    story.append(Paragraph("Fecha de nacimiento", h2c))
            #    story.append(Spacer(0,6))
            #    story.append(Paragraph(str(userprofile.fecha_nacimiento), h3c))
            #    story.append(Spacer(0,12))
            #    story.append(Spacer(0,12))

            if userprofile.telefono and userprofile.telefono != "":
                story.append(Paragraph("Teléfono", h2c))
                story.append(Spacer(0,6))
                story.append(Paragraph(userprofile.telefono, h3c))
                story.append(Spacer(0,12))
                story.append(Spacer(0,12))

            if userprofile.celular and userprofile.celular != "":
                story.append(Paragraph("Celular", h2c))
                story.append(Spacer(0,6))
                story.append(Paragraph(userprofile.celular, h3c))
                story.append(Spacer(0,12))
                story.append(Spacer(0,12))

            if userprofile.interno and userprofile.interno != "":
                story.append(Paragraph("Interno", h2c))
                story.append(Spacer(0,6))
                story.append(Paragraph(userprofile.interno, h3c))
                story.append(Spacer(0,12))
                story.append(Spacer(0,12))

            if userprofile.pais and userprofile.pais != "":
                story.append(Paragraph("País de origen", h2c))
                story.append(Spacer(0,6))
                story.append(Paragraph(userprofile.pais, h3c))
                story.append(Spacer(0,12))
                story.append(Spacer(0,12))

            if userprofile.informacion_personal and userprofile.informacion_personal != "":
                story.append(Paragraph("Información Personal", h2c))
                story.append(Spacer(0,6))
                story.append(Paragraph(userprofile.informacion_personal, h3c))
                #story.append(Spacer(0,12))
                #story.append(Spacer(0,12))

        story.append(PageBreak())

        P = Paragraph('Listado de Publicaciones', h1)
        story.append(P)
        story.append(Spacer(0,12))
        story.append(Spacer(0,12))
        story.append(Spacer(0,12))


        libros = Libros.objects.filter(Q(creado_por=usuario.username) | Q(autores__autor_interno__id__exact=usuario.id)).distinct().all()
        revistas = Revistas.objects.filter(Q(creado_por=usuario.username) | Q(autores__autor_interno__id__exact=usuario.id)).distinct().all()
        confs = Conferencias.objects.filter(Q(creado_por=usuario.username) | Q(autores__autor_interno__id__exact=usuario.id)).distinct().all()
        tesis = Tesis.objects.filter(Q(creado_por=usuario.username) | Q(autores__autor_interno__id__exact=usuario.id)).distinct().all()
        papers = Papers.objects.filter(Q(creado_por=usuario.username) | Q(autores__autor_interno__id__exact=usuario.id)).distinct().all()
        reptec = ReportesTecnicos.objects.filter(Q(creado_por=usuario.username) | Q(autores__autor_interno__id__exact=usuario.id)).distinct().all()

        data = []
        for obj in libros:
            data.append([obj.getDate(), Paragraph(obj.libro, h3)])
        for obj in revistas:
            data.append([obj.getDate(), Paragraph(obj.revista, h3)])
        for obj in confs:
            data.append([obj.getDate(), Paragraph(obj.conferencia, h3)])
        for obj in tesis:
            data.append([obj.getDate(), Paragraph(obj.titulo_tesis, h3)])
        for obj in papers:
            data.append([obj.getDate(), Paragraph(obj.paper, h3)])
        for obj in reptec:
            data.append([obj.getDate(), Paragraph(obj.reporte, h3)])

        t = Table(data)
        table_style_1 = TableStyle ([ ('ALIGN', (0,0), (0,-1), 'CENTER'), ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), ('BOX', (0,0), (-1,-1), 0.25, colors.white) ])
        table_style_1.add('GRID', (0,0), (2,len(data)), 1, colors.black)
        t.setStyle(table_style_1)
        t._argW[0]=1.0*inch
        story.append(t)

        story.append(PageBreak())

#--------------------------------------------------------------------------------------------
    addPageBreak = False
    for proyecto in list_proyectos:
        if addPageBreak:
            story.append(PageBreak())
        else:
            addPageBreak = True

        if not proyecto.Imagen.url.endswith('static/images/default.png'):
            path = os.path.dirname(os.path.abspath(__file__)) + proyecto.Imagen.url.replace('/',os.sep)
            img = Image(path, width=100, height=100)
            img.hAlign = 'CENTER'
            story.append(img)
            story.append(Spacer(0,12))

        texto1 = proyecto.Nombre_proyecto
        P = Paragraph(texto1, h1)
        story.append(P)
        story.append(Spacer(0,12))
        story.append(Spacer(0,12))

        if proyecto.Fuente_de_financiamiento and proyecto.Fuente_de_financiamiento != "":
            story.append(Spacer(0,6))
            data = [[Paragraph("Fuente de financiamiento:", h2), Paragraph(proyecto.Fuente_de_financiamiento, h3)]]
            t = Table(data)
            table_style.add('GRID',(0,0),(2,1),1,colors.white)
            t.setStyle(table_style)
            t._argW[0]=2.1*inch
            story.append(t)
        if proyecto.Capital and proyecto.Capital != "":
            story.append(Spacer(0,6))
            data = [[Paragraph("Capital:", h2), Paragraph(unicode(proyecto.Capital) + ' Gs.', h3)]]
            t = Table(data)
            table_style.add('GRID',(0,0),(2,1),1,colors.white)
            t.setStyle(table_style)
            t._argW[0]=0.7*inch
            story.append(t)
        if proyecto.Colaboradores and proyecto.Colaboradores != "":
            story.append(Spacer(0,6))
            data = [[Paragraph("Colaboradores:", h2), Paragraph(proyecto.Colaboradores, h3)]]
            t = Table(data)
            table_style.add('GRID',(0,0),(2,1),1,colors.white)
            t.setStyle(table_style)
            t._argW[0]=1.3*inch
            story.append(t)
        if proyecto.Fecha_inicio:
            story.append(Spacer(0,6))
            data = [[Paragraph("Fecha de iniciación:", h2), Paragraph(unicode(proyecto.Fecha_inicio), h3)]]
            t = Table(data)
            table_style.add('GRID',(0,0),(2,1),1,colors.white)
            t.setStyle(table_style)
            t._argW[0]=1.7*inch
            story.append(t)
        if proyecto.Fecha_finalizacion:
            story.append(Spacer(0,6))
            data = [[Paragraph("Fecha de finalización:", h2), Paragraph(unicode(proyecto.Fecha_finalizacion), h3)]]
            t = Table(data)
            table_style.add('GRID',(0,0),(2,1),1,colors.white)
            t.setStyle(table_style)
            t._argW[0]=1.8*inch
            story.append(t)
        if proyecto.PaginaWeb and proyecto.PaginaWeb != "":
            story.append(Spacer(0,6))
            data = [[Paragraph("Sitio Web:", h2), Paragraph(unicode(proyecto.PaginaWeb), h3)]]
            t = Table(data)
            table_style.add('GRID',(0,0),(2,1),1,colors.white)
            t.setStyle(table_style)
            t._argW[0]=1.0*inch
            story.append(t)
        if proyecto.Descripcion_proyecto and proyecto.Descripcion_proyecto != "":
            story.append(Spacer(0,6))
            data = [[Paragraph("Descripción:", h2), Paragraph(unicode(proyecto.Descripcion_proyecto), h3)]]
            t = Table(data)
            table_style.add('GRID',(0,0),(2,1),1,colors.white)
            t.setStyle(table_style)
            t._argW[0]=1.1*inch
            story.append(t)
        story.append(Spacer(0,12))
        story.append(Spacer(0,12))
#--------------------------------------------------------------------------------------------
        list_grupos = list(proyecto.Grupos.all())
        list_lineas = list(proyecto.Lineas.all())
        list_departamentos = list(obtenerDeptos(proyecto))
        list_miembros = list(obtenerMiembros(proyecto))
        list_partners = list(proyecto.Partners.all())
#--------------------------------------------------------------------------------------------

        P = Paragraph("Responsables del proyecto:", h2)
        story.append(P)
        story.append(Spacer(0,12))
        data = []
        for p in proyecto.Responsables.all():
            respTitle = ''
            if p.get_profile().titulo and p.get_profile().titulo != '---':
                respTitle = p.get_profile().titulo + ' '
            path = os.path.dirname(os.path.abspath(__file__)) + p.get_profile().foto.url.replace('/',os.sep)
            img = Image(path, width=40, height=40)
            data.append([
                img,
                [Paragraph(respTitle + p.first_name + ' ' + p.last_name, h3), Paragraph(p.email, body_style)]
            ])

        t = Table(data)
        table_style_1 = table_style
        table_style_1.add('GRID',(0,0),(2,len(data)),1,colors.white)
        t.setStyle(table_style_1)
        t._argW[0]=0.7*inch
        story.append(t)
#--------------------------------------------------------------------------------------------
        if list_miembros:
            story.append(Spacer(0,12))
            P = Paragraph("Miembros del proyecto:", h2)
            story.append(P)
            story.append(Spacer(0,12))
            data = []
            for p in list_miembros:
                respTitle = ''
                if p.get_profile().titulo and p.get_profile().titulo != '---':
                    respTitle = p.get_profile().titulo + ' '
                path = os.path.dirname(os.path.abspath(__file__)) + p.get_profile().foto.url.replace('/',os.sep)
                img = Image(path, width=40, height=40)
                data.append([
                    img,
                    [Paragraph(respTitle + p.first_name + ' ' + p.last_name, h3), Paragraph(p.email, body_style)]
                ])

        t = Table(data)
        table_style_1 = table_style
        table_style_1.add('GRID',(0,0),(2,list_miembros.__len__()),1,colors.white)
        t.setStyle(table_style_1)
        t._argW[0]=0.7*inch
        story.append(t)
#--------------------------------------------------------------------------------------------
        if list_grupos:
            story.append(Spacer(0,12))
            P = Paragraph("Grupos de investigación del proyecto:", h2)
            story.append(P)
            story.append(Spacer(0,12))
            data = []
            for p in list_grupos:
                path = os.path.dirname(os.path.abspath(__file__)) + p.Imagen.url.replace('/',os.sep)
                img = Image(path, width=40, height=40)
                data.append([img, [Paragraph(p.Nombre_grupo,h3), Paragraph(p.Descripcion_grupo,body_style)]])
        
            t = Table(data)
            table_style_1 = table_style
            table_style_1.add('GRID',(0,0),(2,list_grupos.__len__()),1, colors.white)
            t.setStyle(table_style_1)
            t._argW[0]=0.7*inch
            story.append(t)
#--------------------------------------------------------------------------------------------
        if list_lineas:
            story.append(Spacer(0,12))
            P = Paragraph("Líneas de investigación del proyecto:", h2)
            story.append(P)
            story.append(Spacer(0,12))
            data = []
            for p in list_lineas:
                path = os.path.dirname(os.path.abspath(__file__)) + p.Imagen.url.replace('/',os.sep)
                img = Image(path, width=40, height=40)
                data.append([img, [Paragraph(p.Nombre_linea,h3), Paragraph(p.Descripcion_linea,body_style)]])

            t = Table(data)
            table_style_1 = table_style
            table_style_1.add('GRID',(0,0),(2,list_lineas.__len__()),1, colors.white)
            t.setStyle(table_style_1)
            t._argW[0]=0.7*inch
            story.append(t)
#--------------------------------------------------------------------------------------------
        if list_departamentos:
            story.append(Spacer(0,12))
            P = Paragraph("Departamentos del proyecto:", h2)
            story.append(P)
            story.append(Spacer(0,12))
            data = []
            for p in list_departamentos:
                path = os.path.dirname(os.path.abspath(__file__)) + p.Imagen.url.replace('/',os.sep)
                img = Image(path, width=40, height=40)
                data.append([img, [Paragraph(p.Nombre_departamento,h3), Paragraph(p.Descripcion_dpto,body_style)]])

            t = Table(data)
            table_style_1 = table_style
            table_style_1.add('GRID',(0,0),(2,list_departamentos.__len__()),1, colors.white)
            t.setStyle(table_style_1)
            t._argW[0]=0.7*inch
            story.append(t)
#--------------------------------------------------------------------------------------------
        if list_partners:
            story.append(Spacer(0,12))
            P = Paragraph("Partners del proyecto:", h2)
            story.append(P)
            story.append(Spacer(0,12))
            data = []
            for p in list_partners:
                path = os.path.dirname(os.path.abspath(__file__)) + p.Imagen.url.replace('/',os.sep)
                img = Image(path, width=40, height=40)
                data.append([img, [Paragraph(p.Nombre_partner,h3), Paragraph(p.Descripcion_partner,body_style)]])

            t = Table(data)
            table_style_1 = table_style
            table_style_1.add('GRID',(0,0),(2,list_partners.__len__()),1, colors.white)
            t.setStyle(table_style_1)
            t._argW[0]=0.7*inch
            story.append(t)
            story.append(Spacer(0,12))
#--------------------------------------------------------------------------------------------  

    doc.build(story)
    return response
